package semantico;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Stack;

@SuppressWarnings("unchecked")
public class SemanticoGUI implements ISemanticoGui{
	HashMap variaveis = new HashMap();
	HashMap nomeClasse = new HashMap();
	HashMap objetos = new HashMap();
	HashMap metodos = new HashMap();
	HashMap atributo = new HashMap();
	Stack pilhaSe = new Stack();
	int contaSe = 0;
	String nomePrograma, classe;
	StringBuffer sb = new StringBuffer();

	public void escreverArquivoGui() {
		try {
			System.out.print("Gerando c�digo GUI");
			BufferedWriter out = new BufferedWriter(new FileWriter(this.classe
					+ ".java"));
			out.write(sb.toString());
			out.close();
			System.out.println("OK");
		} catch (IOException e) {
			System.err.println("Erro ao tentar salvar em arquivo:"
					+ e.getMessage());
		}
	}

	public void fimAnaliseGui() {
		System.out.println("Arquivo Java Gerado");
		escreverArquivoGui();
	}

	public void classeGuiIni(String nomeClasse, String tipo) {
		this.classe = nomeClasse;
		System.out.print("Come�ado a gera��o de c�digo GUI");
		if (tipo.equals("publico")) {
			this.nomeClasse.put(nomeClasse, tipo);
			sb.append("public class " + nomeClasse + "{\n");
			System.out.println("Entrei no inicio de uma classe publica");
		} else if (tipo.equals("privado")) {
			this.nomeClasse.put(nomeClasse, tipo);
			sb.append("private class " + nomeClasse + "{\n");
			System.out.println("Entrei no inicio de uma classe privada");
		} else {
			System.err.println("erro: Visibilidade inv�lida");
			System.exit(1);
		}
		
		/**if (this.nomeClasse.containsKey(nomeClasse)) {
			String tipoClasse = (String) this.nomeClasse.get(nomeClasse);
			if (tipo.equals("publico")) {
				// System.out.println(tipoClasse);
				if (tipoClasse.equals(tipo)) {
					sb.append(".class public " + nomeClasse
							+ " extends [mscorlib]System.Object\n");
					sb.append("{\n");
					System.out
							.println("Entrei no inicio de uma classe publica");
				} else {
					System.err
							.println("erro:Tipo diferente da assinatura da classe");
					System.exit(1);
				}
			} else if (tipo.equals("privado")) {
				if (tipoClasse.equals(tipo)) {
					sb.append(".class private " + nomeClasse
							+ " extends [mscorlib]System.Object \n");
					sb.append("{\n");
					System.out
							.println("Entrei no inicio de uma classe privada");
				} else {
					System.err
							.println("erro:Tipo diferente da assinatura da classe");
					System.exit(1);
				}
			} else {
				System.err.println("erro: Tipo de classe indefinido");
				System.exit(1);
			}
		} else {
			System.err.println("erro: Classe indefinida na assinatura");
			System.exit(1);
		}**/
	}

	public void classeFim() {
		sb.append("}\n");
		System.out.println("Fim da classe");
	}
	
	public void construtorPadraoGui(String nomeClasse) {
		
	}
	
	public void declaraAtributoGui(String str, String tipo) {
		this.atributo.put(str, this.classe);
		if (tipo.equals("visivel")) {
			variaveis.put(str, new Integer(99));
			sb.append("		public int " + str + "; \n");
			System.out.println("Encontrei um atributo publico para a GUI");
		} else if (tipo.equals("escondido")) {
			variaveis.put(str, new Integer(99));
			sb.append("		private int " + str + "; \n");
			System.out.println("Encontrei um atributo privado para a GUI");
		} else {
			System.err.println("erro:Visibilidade inv�lida");
			System.exit(1);
		}
	}

	//Metodo sem passagem de parametro
	//TODO falta ainda verificar como fazer para que quando o m�todo tiver
	//retorno ele coloque o return
	public void inicioMetodoGui(String str, String tipo, String retorno) {
		if (tipo.equals("publico")) {
			if (retorno.equals("integer")) {
				sb.append("	public int " + str + "(){\n");
				System.out.println("Encontrei um metodo com retorno e publico para a GUI");
			} else if (retorno.equals("vazio")) {
				sb.append("	public void " + str	+ "() {\n");
				System.out.println("Encontrei um m�todo sem retorno e publico para a GUI");
			} else {
				System.err.println("erro: Tipo de retorno inv�lido");
				System.exit(1);
			}
		} else if (tipo.equals("escondido")) {
			if (retorno.equals("integer")) {
				sb.append("	private int " + str+ "(){\n");
				System.out.println("Encontrei um metodo com retorno e privado para a GUI");
			} else if (retorno.equals("voidi")) {
				sb.append("	private void " + str+ "(){\n");
				System.out.println("Encontrei um m�todo sem retorno e privado para a GUI");
			} else {
				System.err.println("erro: Tipo de retorno inv�lido");
				System.exit(1);
			}
		} else {
			System.err.println("erro: Visibilidade inv�lida");
			System.exit(1);
		}
	}

	public void fimMetodo() {
		sb.append("		ret\n");
		sb.append("	}\n");
	}
	

}
